use rocket::config::Config;
use log::{info};
use clap::Parser;
use config::{Args, bootstrap_check, load_config, merge_config, init_logger};
use crate::page_cache::scan_markdown;

mod routes;
mod config;
mod page_cache;
mod file_utils;

#[macro_use] extern crate rocket;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 解析命令行参数
    let args = Args::parse();
    // 加载配置文件
    let (file_config, config_messages) = load_config(args.config.clone());
    // 合并配置 (命令行参数优先级高于配置文件)
    let (port, address, environment) = merge_config(&args, &file_config);
    // 初始化日志系统（根据配置文件设置日志级别）
    init_logger(&file_config);
    // 输出配置加载信息
    for message in config_messages {
        if message.contains("成功") {
            info!("{}", message);
        } else {
            debug!("{}", message);
        }
    }
    print_info(&environment);
    bootstrap_check(&address, port);
    // 初始化缓存
    scan_markdown();
    // 创建自定义配置
    let config = Config {
        port,
        address: address.parse().unwrap(),
        ..Config::default()
    };
    // 构建并启动 Rocket
    let _rocket = rocket::custom(&config)
        // 挂载自定义路由处理动态文件服务
        .mount("/", routes![routes::index, routes::dynamic_serve])
        // 使用 FileServer 提供 /public 路径的静态文件服务
        // .mount("/public", FileServer::from("./static"))
        // 注册自定义错误页面
        .register("/", catchers![routes::not_found, routes::internal_error])
        .launch()
        .await;
    Ok(())
}

/// 打印启动信息
fn print_info(environment: &str) {
    let bootstrap_msg = "\
===========================================
✅ 欢迎使用 lightbulb web server (小灯泡 Web 服务)
🔧 本服务仅用于测试，请勿用于生产环境！
===========================================\
    ";
    println!("{}", bootstrap_msg);
    println!("正在启动 lightbulb web server...");
    let args = Args::parse();
    if let Some(config_path) = &args.config {
        println!("使用配置文件: {}", config_path);
    }
    println!("运行环境: {}", environment);
}
